package com.sky.utils;

import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

public class BaiduSignUtil {

    /**
     * 生成百度地图签名 sn 参数
     * @param path 请求路径，例如 "/geocoding/v3"
     * @param queryString 请求参数（不包括 sn），例如 "address=xxx&output=json&ak=你的ak"
     * @param sk 百度地图控制台中的安全码 SK
     * @return sn 签名
     */
    public static String generateSn(String path, String queryString, String sk) {
        try {
            String fullString = path + "?" + queryString + sk;
            String encoded = URLEncoder.encode(fullString, StandardCharsets.UTF_8.name());
            return md5(encoded);
        } catch (Exception e) {
            throw new RuntimeException("生成百度地图签名失败", e);
        }
    }

    /**
     * 构建最终完整 URL
     */
    public static String buildSignedUrl(String baseUrl, String path, String queryString, String sk) {
        String sn = generateSn(path, queryString, sk);
        return baseUrl + path + "?" + queryString + "&sn=" + sn;
    }

    /**
     * 计算 MD5 值
     */
    private static String md5(String input) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] digest = md.digest(input.getBytes(StandardCharsets.UTF_8));
        StringBuilder sb = new StringBuilder();
        for (byte b : digest) {
            sb.append(String.format("%02x", b & 0xff));
        }
        return sb.toString();
    }
}
